/**
 * Midscene.js 实现
 * 提供AI指令解析和测试动作生成功能
 */

import { AITestDefinition, TestAction } from '../types';
import { createContextLogger } from '../utils/logger';

// 创建日志记录器
const logger = createContextLogger('Midscene');

/**
 * Midscene核心类
 * 负责AI指令解析和测试动作生成
 */
export class Midscene {
  private static instance: Midscene;
  private testDefinitions: Map<string, AITestDefinition> = new Map();

  /**
   * 获取单例实例
   */
  public static getInstance(): Midscene {
    if (!Midscene.instance) {
      Midscene.instance = new Midscene();
    }
    return Midscene.instance;
  }

  /**
   * 注册测试定义
   * @param testDefinition 测试定义对象
   * @returns 测试ID
   */
  public registerTest(testDefinition: AITestDefinition): string {
    const testId = `test_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
    this.testDefinitions.set(testId, testDefinition);
    logger.info(`已注册测试: ${testDefinition.scenario}`, { testId });
    return testId;
  }

  /**
   * 获取测试定义
   * @param testId 测试ID
   * @returns 测试定义对象
   */
  public getTest(testId: string): AITestDefinition | undefined {
    return this.testDefinitions.get(testId);
  }

  /**
   * 从自然语言描述生成测试动作
   * @param prompt 自然语言描述
   * @returns 测试动作数组的Promise
   */
  public async generateActionsFromPrompt(prompt: string): Promise<TestAction[]> {
    logger.info(`从提示词生成测试动作: ${prompt}`);
    
    // 这里将来会集成LangChain或OpenAI API来解析自然语言
    // 目前返回一些模拟的测试动作
    return this.mockGenerateActions(prompt);
  }

  /**
   * 模拟生成测试动作（临时方法，将来会被AI替代）
   * @param prompt 自然语言描述
   * @returns 测试动作数组
   */
  private mockGenerateActions(prompt: string): TestAction[] {
    const actions: TestAction[] = [];
    
    // 修改导航动作，使用完整URL
    actions.push({
      type: 'navigate',
      value: 'http://localhost:3000/'  // 使用完整URL
    });
    
    // 根据提示词中的关键词添加不同动作
    if (prompt.includes('登录') || prompt.includes('注册')) {
      actions.push(
        { type: 'fill', selector: '#email', value: '{{generateEmail()}}' },
        { type: 'fill', selector: '#password', value: 'TestPassword123' },
        { type: 'click', selector: '#submit' },
        { type: 'assert', condition: 'url包含 "/dashboard"' }
      );
    } else if (prompt.includes('搜索')) {
      actions.push(
        { type: 'fill', selector: '.search-input', value: '测试产品' },
        { type: 'press', value: 'Enter' },
        { type: 'assert', condition: '.search-results 存在' }
      );
    } else if (prompt.includes('购物车') || prompt.includes('添加商品')) {
      actions.push(
        { type: 'click', selector: '.product-item:first-child .add-to-cart' },
        { type: 'wait', value: '1000' },
        { type: 'click', selector: '.cart-icon' },
        { type: 'assert', condition: '.cart-items 包含 "测试产品"' }
      );
    }
    
    logger.debug('生成的测试动作', { actions });
    return actions;
  }
}

/**
 * 定义AI测试的快捷函数
 * @param testDefinition 测试定义对象
 * @returns 测试ID
 */
export function defineAITest(testDefinition: AITestDefinition): string {
  return Midscene.getInstance().registerTest(testDefinition);
}

/**
 * 从自然语言描述生成测试动作的快捷函数
 * @param prompt 自然语言描述
 * @returns 测试动作数组的Promise
 */
export async function generateActions(prompt: string): Promise<TestAction[]> {
  return await Midscene.getInstance().generateActionsFromPrompt(prompt);
}